<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Lucene表达式语言 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'modules-scripting-expression.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-scripting-expression.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-scripting-expression.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/modules-scripting-expression.html" rel="nofollow" target="_blank">../en/modules-scripting-expression.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="modules-scripting.html">脚本</a></span>
»
<span class="breadcrumb-node">Lucene表达式语言</span>
</div>
<div class="navheader">
<span class="prev">
<a href="modules-scripting-painless.html">« painless脚本语言</a>
</span>
<span class="next">
<a href="modules-scripting-engine.html">高级脚本使用脚本引擎 »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="modules-scripting-expression"></a>Lucene表达式语言
</h2>
</div></div></div>
<p>
Lucene的表达式将<code class="literal">javascript</code>表达式编译成字节码。

它们是为高性能定制 排名(ranking)和排序(sorting) 功能而设计的，默认情况下支持内联(<code class="literal">inline</code>)和存储的(<code class="literal">stored</code>)脚本。
</p>
<h3>
<a id="_performance"></a>性能
</h3>
<p>
表达式被设计成具有与自定义Lucene代码相媲美的性能。 

这种性能是因为与其他脚本引擎相比，每个文档的开销较低：表达式做了更多的“预先准备”。
</p>
<p>
这使得执行速度非常快，甚至比编写原生(<code class="literal">native</code>)脚本还要快。
</p>
<h3>
<a id="_syntax_17"></a>语法
</h3>
<p>表达式支持javascript语法的子集：单个表达式。</p>
<p>有关可用运算符和函数的详细信息，请参见<a href="http://lucene.apache.org/core/6_0_0/expressions/index.html?org/apache/lucene/expressions/js/package-summary.html" class="ulink" target="_top">表达式模块文档</a>。</p>
<p><code class="literal">expression</code>脚本中的变量可用于访问：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
文档的字段，比如：<code class="literal">doc['myfield'].value</code>
</li>
<li class="listitem">
字段支持的变量和函数，比如：<code class="literal">doc['myfield'].empty</code>
</li>
<li class="listitem">
传递给脚本的参数，比如 <code class="literal">mymodifier</code>
</li>
<li class="listitem">
当前文档的得分 <code class="literal">_score</code> (仅在<code class="literal">script_score</code>中使用时有效)
</li>
</ul>
</div>
<p>
可以将表达式脚本用于<code class="literal">script_score</code>、<code class="literal">script_fields</code>、排序脚本和数值聚合脚本，只需将参数<code class="literal">lang</code>设置为<code class="literal">expression</code>。
</p>
<h3>
<a id="_numeric_field_api"></a>numeric字段API
</h3>
<div class="informaltable">
<table border="1" cellpadding="4px">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">表达式</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].value</code></p></td>
<td align="left" valign="top"><p>字段的值，双精度(<code class="literal">double</code>)值</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].empty</code></p></td>
<td align="left" valign="top"><p>一个布尔值，指示该字段在文档中是否为空值。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].length</code></p></td>
<td align="left" valign="top"><p>该文档中值的数量。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].min()</code></p></td>
<td align="left" valign="top"><p>该文档中字段的最小值。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].max()</code></p></td>
<td align="left" valign="top"><p>该文档中字段的最大值。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].median()</code></p></td>
<td align="left" valign="top"><p>该文档中字段值的中位数。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].avg()</code></p></td>
<td align="left" valign="top"><p>该文档中字段值的平均数。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].sum()</code></p></td>
<td align="left" valign="top"><p>该文档中字段值的总和。</p></td>
</tr>
</tbody>
</table>
</div>
<p>
当文档完全缺少该字段时，默认情况下，该值将被视为<code class="literal">0</code>。

你也可以将其视为另一个值，例如 <code class="literal">doc['myfield'].empty ? 100 : doc['myfield'].value</code>
</p>
<p>
当文档的字段有多个值时，默认情况下返回最小值。

你也可以选择一个不同的值，例如 <code class="literal">doc['myfield'].sum()</code>。
</p>
<p>
布尔(bool)字段显示为数字，<code class="literal">true</code>映射为<code class="literal">1</code>，<code class="literal">false</code>映射为<code class="literal">0</code>。

例如：<code class="literal">doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value</code>
</p>
<h3>
<a id="_date_field_api"></a>date字段API
</h3>
<p>
date字段被视为自1970年1月1日以来的毫秒数，并支持上述numeric字段API，以及对某些特定的日期字段的访问:
</p>
<div class="informaltable">
<table border="1" cellpadding="4px">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">表达式</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.centuryOfEra</code></p></td>
<td align="left" valign="top"><p>世纪 (1-2920000)</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.dayOfMonth</code></p></td>
<td align="left" valign="top"><p>天 (1-31)，比如 <code class="literal">1</code> 表示每个月的第一天</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.dayOfWeek</code></p></td>
<td align="left" valign="top"><p>星期几 (1-7)，比如<code class="literal">1</code> 代表星期一</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.dayOfYear</code></p></td>
<td align="left" valign="top"><p>一年中的某一天，比如<code class="literal">1</code> 表示一月1号。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.era</code></p></td>
<td align="left" valign="top"><p>纪元，<code class="literal">0</code> 表示 公元前(BC)，<code class="literal">1</code> 表示公元(AD)。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.hourOfDay</code></p></td>
<td align="left" valign="top"><p>小时(0-23)。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.millisOfDay</code></p></td>
<td align="left" valign="top"><p>一天中的毫秒数(0-86399999)。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.millisOfSecond</code></p></td>
<td align="left" valign="top"><p>一秒内的毫秒(0-999)。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.minuteOfDay</code></p></td>
<td align="left" valign="top"><p>一天中的分钟(0-1439)。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.minuteOfHour</code></p></td>
<td align="left" valign="top"><p>一小时内的分钟(0-59).</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.monthOfYear</code></p></td>
<td align="left" valign="top"><p>一年中的月数(1-12)，比如<code class="literal">1</code> 表示一月份</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.secondOfDay</code></p></td>
<td align="left" valign="top"><p>一天中的秒数(0-86399)</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.secondOfMinute</code></p></td>
<td align="left" valign="top"><p>一分钟内的描述(0-59)</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.year</code></p></td>
<td align="left" valign="top"><p>年(-292000000 - 292000000)</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.yearOfCentury</code></p></td>
<td align="left" valign="top"><p>一个世纪中的年数(1-100)</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].date.yearOfEra</code></p></td>
<td align="left" valign="top"><p>一个纪元中的年(1-292000000)</p></td>
</tr>
</tbody>
</table>
</div>
<p>
下面这个例子显示了<code class="literal">date</code>字段 date0 和 date1 之间的年份差异：
</p>
<p><code class="literal">doc['date1'].date.year - doc['date0'].date.year</code></p>
<h3>
<a id="geo-point-field-api"></a><code class="literal">geo_point</code>字段API
</h3>
<div class="informaltable">
<table border="1" cellpadding="4px">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">表达式</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].empty</code></p></td>
<td align="left" valign="top"><p>一个布尔值，指示该字段在文档中是否为空值。</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].lat</code></p></td>
<td align="left" valign="top"><p>地理位置坐标点的纬度值</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">doc['field_name'].lon</code></p></td>
<td align="left" valign="top"><p>地理位置坐标点的经度值</p></td>
</tr>
</tbody>
</table>
</div>
<p>下面这个例子计算与华盛顿市区的距离（单位为公里）：</p>
<p><code class="literal">haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)</code></p>
<p>
在这个例子中，坐标可以作为参数传递给脚本，例如基于用户的地理位置。
</p>
<h3>
<a id="_limitations_7"></a>局限性
</h3>
<p>相对于其他脚本语言有一些限制：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
只能访问 numeric、boolean、date 及 geo_point 字段
</li>
<li class="listitem">
存储(的)字段不可用
</li>
</ul>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="modules-scripting-painless.html">« painless脚本语言</a>
</span>
<span class="next">
<a href="modules-scripting-engine.html">高级脚本使用脚本引擎 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>